package org.abettor.util;

import java.io.UnsupportedEncodingException;

/**
 * 字符串工具类
 * @author <a href="http://www.abettor.org/" target="_blank">abettor</a>
 *
 */
public abstract class StringTool
{
	/**
	 * 比较两个都有可能为null的字符串是否相等
	 * @param s1 字符串1
	 * @param s2 字符串2
	 * @return 同时为null或相等（equals）返回true，否则返回false
	 */
	public static boolean sameString(String s1, String s2)
	{
		if(s1 == null && s2 == null)
		{
			return true;
		}

		if(s1 == null && s2 != null || s1 != null && s2 == null)
		{
			return false;
		}

		return s1.equals(s2);
	}

	/**
	 * 利用非正则表达式的方式用repl替换字符串str中出现的所有sub
	 * <br />只扫描一次，不递归
	 * @param str 要操作的目标字符串
	 * @param sub 需要替换的字符串
	 * @param repl 用以替换的字符串
	 * @return 进行替换后的结果
	 */
	public static String replaceAll(String str, String sub, String repl)
	{
		if(str == null || str.length() == 0)
		{
			return str;
		}

		int index = str.indexOf(sub);
		if(index != -1)
		{
			String s1 = str.substring(0, index);
			String s2 = str.substring(index + sub.length());
			str = s1 + repl + replaceAll(s2, sub, repl);
		}

		return str;
	}

	/**
	 * 将一个byte数组转化为十六进制形式
	 * @param b 要转化的byte数组
	 * @return 返回十六进制字符串
	 */
	public static String bytesToHexString(byte[] b)
	{
		if (b == null) {
			return null;
		}

		if (b.length == 0) {
			return new String("");
		}

		StringBuffer stringBuf = new StringBuffer();
		String tmp;
		int len = b.length;
		for (int n = 0; n < len; n++) {
			tmp = Integer.toHexString(b[n] & 0xFF);
			if (tmp.length() == 1) {
				tmp = "0" + tmp;
			}

			stringBuf.append(tmp);
		}

		return stringBuf.toString().toUpperCase();
	}

	/**
	 * 字符串比较大小，用于汉字排序
	 * @param str1 第一个字符串
	 * @param str2 第二个字符串
	 * @return str1等于str2返回0，str1小于str2返回-1，否则返回1。
	 * @throws UnsupportedEncodingException 
	 */
	public static int compare(String str1, String str2) throws UnsupportedEncodingException
	{
		if(str1 == null && str2 == null)
		{
			return 0;
		}
		else if(str1 == null)
		{
			return -1;
		}
		else if(str2 == null)
		{
			return 1;
		}

		if(str1.isEmpty() && str2.isEmpty())
		{
			return 0;
		}
		else if(str1.isEmpty())
		{
			return -1;
		}
		else if(str2.isEmpty())
		{
			return 1;
		}

		byte[] b1 = str1.getBytes("GBK");
		byte[] b2 = str2.getBytes("GBK");
		int len1 = b1.length;
		int len2 = b2.length;
		int i = 0;
		while(i < len1 && i < len2)
		{
			if(b1[i] * b2[i] >= 0 && b1[i] < b2[i])
			{
				return -1;
			}
			else if(b1[i] * b2[i] < 0 && b1[i] < b2[i])
			{
				return 1;
			}
			else if(b1[i] * b2[i] >= 0 && b1[i] > b2[i])
			{
				return 1;
			}
			else if(b1[i] * b2[i] < 0 && b1[i] > b2[i])
			{
				return -1;
			}

			i ++;
		}

		if(len1 < len2)
		{
			return -1;
		}
		else if(len1 > len2)
		{
			return 1;
		}

		return 0;
	}

	/**
	 * 将普通字符串转化为能够在HTML页面上显示的Unicode码形式
	 * @param str 要转化的字符串
	 * @throws UnsupportedEncodingException
	 */
	public static String toHtmlUnicode(String str) throws UnsupportedEncodingException
	{
		String tmp = "";
		byte[] bytes = str.getBytes("Unicode");
		for (int i = 2; i < bytes.length; i += 2) {
			String hexStr = Integer.toHexString(bytes[i]);
			int hexLen = hexStr.length();
			if (hexLen < 2) {
				tmp += "%u" + "0" + hexStr;
			} else {
				tmp += "%u" + hexStr.substring(hexLen - 2);
			}

			hexStr = Integer.toHexString(bytes[i + 1]);
			hexLen = hexStr.length();
			if (hexLen < 2) {
				tmp += "0" + hexStr;
			} else {
				tmp += hexStr.substring(hexLen - 2);
			}
		}

		return tmp;
	}

	/**
	 * 将包含非ACSII字符的字符串转化为能够在HTML页面上显示的Unicode码形式
	 * @param str 要转化的字符串
	 * @throws UnsupportedEncodingException
	 */
	public static String nonAsciiToHtmlUnicode(String str) throws UnsupportedEncodingException
	{
		byte[] bytes = str.getBytes("Unicode");
		for (int i = 2; i < bytes.length; i += 2) {
			String hexStr = Integer.toHexString(bytes[i]);
			int hexLen = hexStr.length();
			if(hexLen >= 2)
			{
				return toHtmlUnicode(str);
			}
		}

		return str;
	}
}
